import UIKit

// 定义枚举关联 ViewController
enum ViewControllerType: String, CaseIterable, CustomStringConvertible {
    case label, textField, button, textView, UIswitch, Slider, Stepper, alert, Segmented, PickerView, DatePicker, ProgressView, ActivityIndicator, CollectionView
    
    func createViewController() -> UIViewController {
        switch self {
        case .label:
            return Label()
        case .textField:
            return TextField()
        case .button:
            return Button()
        case .textView:
            return TextView()
        case .UIswitch:
            return Switch()
        case .Slider:
            return SliderView()
        case .Stepper:
            return StepperView()
        case .Segmented:
            return SegmentedControl()
        case .DatePicker:
            return DatePickerExampleViewController()
            
            
        case .alert:
            let alert = UIAlertController(title: "说明", message: "请重新选择新的功能\n之前选择的不对", preferredStyle: .alert)
            let confirmAction = UIAlertAction(title: "确定", style: .default) { action in
                print("点击了确定按钮")
            }
            alert.addAction(confirmAction)
            let cancelAction = UIAlertAction(title: "取消", style: .cancel)
            alert.addAction(cancelAction)
            alert.addTextField { textField in
//                print(textField.text)
            }
//            let deleteAction = UIAlertAction(title: "删除", style: .destructive)
//            alert.addAction(deleteAction)
            return alert

        case .PickerView:
            return PickerViewExample()
        case .ProgressView:
            return ProgressViewExampleViewController()
        case .ActivityIndicator:
            return ActivityIndicatorExampleViewController()
        case .CollectionView:
            return CollectionViewController()
        }
    }
    
    var description: String {
        switch self {
        case .label:
            "UILabel"
        case .textField:
            "UITextField"
        case .button:
            "UIButton"
        case .textView:
            "UITextView"
        case .UIswitch:
            "UISwitch"
        case .Slider:
            "UISlider"
        case .Stepper:
            "UIStepper"
        case .alert:
            "UIAlertController"
        case .Segmented:
            "UISegmentedControl"
        case .PickerView:
            "UIPickerView"
        case .DatePicker:
            "UIDatePickerViewController"
        case .ProgressView:
            "UIProgressView"
        case .ActivityIndicator:
            "UIActivityIndicator"
        case .CollectionView:
            "UICollectionViewController"
        }
    }
    
}

class ViewController: UIViewController {
    let data: [ViewControllerType] = ViewControllerType.allCases
    
    lazy var tableView: UITableView = {
        let tableView = UITableView(frame: .zero, style: .plain)
        /*
        在iOS的表格视图中，单元格（UITableViewCell）是可复用的组件。当用户滚动表格时，已经滚出屏幕的单元格会被放入一个复用池中，等待后续需要显示新行时重新使用。这样可以显著提高性能，避免频繁创建和销毁大量单元格。

         注册单元格的目的：告诉表格视图，当需要显示某一行时，可以从复用池中获取哪种类型的单元格。*/
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        /* tableView.dataSource = self
        作用：将当前视图控制器设置为表格视图的数据源（DataSource）。
        数据源协议：UITableViewDataSource，它定义了一系列必须实现的方法，用于告诉表格：
        有多少个分区（section）
        每个分区有多少行（row）
        每一行显示什么内容（cell）*/
        tableView.dataSource = self
        /*
         tableView.delegate = self
         作用：将当前视图控制器设置为表格视图的代理（Delegate）。
         代理协议：UITableViewDelegate，它定义了一系列可选方法，用于处理表格的交互事件和外观样式：
         行的选中事件
         行的高度
         行的删除、移动等操作
         分区头 / 尾的样式
         */
        tableView.delegate = self
        return tableView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        navigationItem.title = "UI控件"
        
        // 添加表格视图到视图层次结构
        view.addSubview(tableView)
        //作用是将表格视图的尺寸设置为与父视图完全一致，使其填满屏幕。在简单场景中可快速实现全屏显示，而在复杂布局中建议使用自动布局以获得更好的适配性和扩展性。
        tableView.frame = view.bounds
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        data.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // 从复用池中获取单元格
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        // 配置单元格内容
        let item = data[indexPath.row]
        cell.textLabel?.text = item.description
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        let item = data[indexPath.row]
        print("选中了: \(item.description)")
        
        // 根据控制器类型创建实例
        let viewController = item.createViewController()
        viewController.title = item.description // 设置标题
        
        if item == .alert {
            present(viewController, animated: true)
        } else {
            // 跳转
            navigationController?.pushViewController(viewController, animated: true)
        }
    }
}
